package Interface;/*
 *
 * @author 陈粒
 * @version 创建时间：2021/7/9 16:54
 */

import org.junit.Test;

/**
 * 接口（Interface），在JAVA编程语言中是一个抽象类型，是抽象方法的集合。
 * 接口通常以interface来声明。一个类通过继承接口的方式，从而来继承接口的抽象方法。
 * 定义：如果一个类只由抽象方法和全局常量组成，则可以定义为一个接口
 * 二、接口的使用：
 *1、由于接口里面存在抽象方法，所以接口对象不能直接使用关键字new进行实例化。接口的使用原则如下：
 * （1）接口必须要有子类，但此时一个子类可以使用implements关键字实现多个接口；
 * （2）接口的子类如果不是抽象类，那么必须要重写接口中的全部抽象方法；
 * （3）接口的对象可以利用子类对象的向上转型进行实例化。（父类为接口）
 * （4）一个接口可以用extends继承任意个其它接口
 * （5）抽象类可以用implements继承任意个接口，可以实现接口的任意个方法，也可以不实现任何方法
 */
interface A{
    void price();//默认写有public abstract,抽象方法
    void speed();//默认写有public abstract,抽象方法
    String s="接口定义的静态最终字符串，全局变量";//全局变量，默认写有public static final
}
interface B{
    void print();//默认写有public abstract,抽象方法
}
interface C extends A, B {//接口C继承接口A和B，一个接口可以继承多个接口
}
class Vehicle{//交通工具类，普通类

}
class Car extends Vehicle implements A, B {//继承Vehicle并实现接口A和B
    @Override
    public void price(){
        System.out.println("汽车的价格为50");
    }
    @Override
    public void speed(){
        System.out.println("汽车的速度为50");
    }
    @Override
    public void print(){
        System.out.println(s);
    }
}
class Aircraft extends Vehicle implements A, B {//继承Vehicle并实现接口A和B
    @Override
    public void price(){
        System.out.println("飞机的价格为500");
    }
    @Override
    public void speed(){
        System.out.println("飞机的速度为500");
    }
    @Override
    public void print(){
        System.out.println(s);
    }
}
class Ship extends Vehicle implements C {//继承Vehicle并实现接口C，接口C继承自A和B
    @Override
    public void price(){
        System.out.println("船的价格为100");
    }
    @Override
    public void speed(){
        System.out.println("船的速度为100");
    }
    @Override
    public void print(){
        System.out.println(s);
    }
}
abstract class D implements C{//抽象类D继承接口C，不用实现C的方法,也可以实现任意方法
    @Override
    public void speed(){
        System.out.println("船的速度为100");
    }
}
public class Interface {
    public static void main(String[] args){
        A c1=new Car();//上溯造型
        c1.price();
        c1.speed();
        B c2=new Car();//上溯造型
        c2.print();
        System.out.println("-----------------------");
        A a1=new Aircraft();//上溯造型
        a1.price();
        a1.speed();
        B a2=new Aircraft();//上溯造型
        a2.print();
        System.out.println("-----------------------");
        C s=new Ship();//上溯造型
        s.price();
        s.speed();
        s.print();
    }
}